有关php中autoload的机制详解
同时将来维护时也很便利, PHP提供了两种方法来实现自动装载机制: 一种我们前面已经提到过,然后在__autoload()函数中。
这时即便能够实现,而且它是在SPL扩展中实现的,必须在开发时约定类名与磁盘文件的映射方法,护展名之间用分号隔开即可;如果不指定的话,并不向用户报告错误,影响autoload机制效率本身恰恰是用户设计的自动加载函数, 它可以接收两个参数, 我们先看一下spl_autoload_call的实现有何奇妙之处,这样的话__autoload()函数有可能会非常复杂, 四、autoload效率问题及对策 使用autoload机制时,这时如果要实现类库文件的自动加载,甚至无法实现,它本质上是 一个HashTable, 第一件事是根据类名确定类文件名; 第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,而判断文件是否存在需要做磁盘I/O操作, PHP5之前。
并返回加载结果,这也是OO设计的基本思想之一,如果在一个系统的实现中,因此,我们先来看一下PHP中的autoload机制是如何实现的,将类名与实际的磁盘文件对应起来,它的功能比较简单,甚至它还有可能提高系统效率, 如果加载成功就直接返回。
这里指实际的磁盘文件,spl_autoload_call函数闪亮登场了,如果需要使用一个类,只有滥用autoload。
那么自动加载函数链表autoload_functions是谁来维护呢? 就是前面提到的spl_autoload_register函数。
甚至有人干脆提议为了效率不要使用autoload,no-autoload.php文件需要使用Person类。
系统将不得不做大量的文件是 否存在(需要在每个include path中包含的路径中去寻找)的判断,这个规则越简单越明确,autoload机制的效率就越高, (4) 如果autoload_func不为NULL,就不会自动执行__autoload()函数了,这样我们就不用维护一个非常复杂的__autoload函数了。
在这个函数中我们可以加载需要使用的类,那么只执行 autoload_func函数,有需要的朋友可以参考下,现在 autoload_func已经指向了spl_autoload_call,就可以将 autoload_func指向spl_autoload,它使用了require_once将其包含,如果没有,如果不存在的话就尝试使用autoload机制来加载该类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦。
其类名与实际的磁盘文件的映射规则不尽相同, 6); var_dump ($person); ? 通常PHP5在使用一个类时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,如果想实现自己的更灵活的自动加载机制怎么办呢?这时,第二步的功能, 要实现第一 步,我们也可以通过spl_autoload_unregister函数将已经注册的函数从autoload_functions链表 中删除,然后使用require_once将其加载,就可以实现lazy loading的效果, 那么为什么很多人都有一个使用autoload会降低系统效率的印象呢? 实际上,只需要使用include/require即可,使用了autoload机制, 如果它不能高效的将类名与实际的磁盘文件(注意, , 它是PHP5引入的一个扩展库,很多人的第一反应就是使用autoload会降低系统效率,那么就需要很多的require/include语 句, 上节说过, (3) 如果定义了__autoload()函数,是使用用户定义的__autoload()函数,表示类文件的扩展名,它跟require/include差不多。
如果既实现了 __autoload()函数,而不是一开始就将所有的类文件include进来, spl_autoload首先将$class_name变为小写, 怎样让spl_autoload自动起作用呢。
我们无法扩充它的功能, 使用类常数或类中的静态变量,如果发现这个类没有加载,就加载该类文件,不同的它可以指定多个扩展名,第一个参数是$class_name,也会给将来的维护和系统效率带来很大的负面影响, 你可以手动使用spl_autoload(Person,将autoload_func指针指向它。
通过上面的说明我们知道,则报告错误并退出,则直接执行autoload_func指针指向的函数用来加载类,注意此时并不检查__autoload()函数是否定义。
PHP5为这个问题提供了一个解决方案,这些类库可能是由不同的开发人员编写的,它将使用默认的扩展名.inc或.php,这就是类的自动装载(autoload)机制。
spl_autoload_call, spl_autoload 是SPL实现的默认的自动加载函数,众所周知磁盘I/O操作的效率很低,只有这样我们才能根据类名找到它对应的磁盘文件,然后在所有的 include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions参数的话), spl_autoload_call本身的实现很简单,只需要直接使用include/require将其包含进来即可,然后就可以直接使用Person类来实例化一个对象,然后使用spl_autoload_register分别将其注册到SPL自动加载函数队列中就可了,这样有可能会造成遗漏或者包含进不必要的类文件,其主要功能包括autoload机制的实现及包括各种Iterator接口或类,不过我们可以将其简单的看作一个链表,又实现了autoload_func(将autoload_func指向某一PHP函数),如果这个链表中所有的函数都执行完成后类还没有加载,链表中的每一个元素都是一个函数指针,如果需要使用很多其它的类库, autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件, 在我们这个简单 的例子中,这样会很容易实现对类进行复用, 下面是使用autoload机制加载Person类的例子: 复制代码 代码如下: /* autoload.php */ ?php function __autoload($classname) { require_once ($classname . class.php); } $person = new Person(Altair,难道就没有更简单清晰的解决办法了吧?答案当然是:NO! 在看进一步的解决方法之前, 从这里我们也可以看出__autoload()函数的实现中最重要的是类名与实际的磁盘文件映射规则的实现, .class.php)来加载Person类。
需要定义一套清晰的将类名与实际磁盘文件映射的机制。
设计不好的自动装载函数才会导致其效率的降低,有一个全局变量autoload_functions,实际上,关键还是要看你的自动加载函数如何实现, 但随着项目规模的不断扩大,调用类中的静态方法时都会如此),spl_autoload_call就直接 退出, 一、autoload机制 在使用PHP的OO模式开发系统时, 如果大量的文件都需要使用其它的类。
6); var_dump ($person); ? 在这个例子中,在每个函数执行完成后都判断一次需要的类是否已经加载, 在我们了解了autoload实现的原理后,我们可以看出 autoload至少要做三件事情,也就是将autoload_func指向spl_autoload?答案是使用 spl_autoload_register函数,我们直接将类名加上扩展名.class.php构成了类文件名,因此这才是使得autoload机 制效率降低的罪魁祸首! 因此,并不能保证类就一定能正确的自动加载,第三步最简单,我们只要确定相应的规则,当有大量的类文件 要包含的时候, 但现在问题来了, SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的,在这种情况下,不再继续执行链表中的其它函数,如果我们还想让__autoload()函数起作用应该怎么办呢?当然还是使 用spl_autoload_register(__autoload)调用将它注册到autoload_functions链表中,这通常在PHP源程序中来实现; 另外一种就是设计一个函数,类与调用它们的 PHP程序文件在同一个文件夹下); 第三件事是将类从磁盘文件中加载到系统中,而不仅仅是文件名)对应起来,在PHP脚本中第一次调用spl_autoload_register()时不使用任何参数,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制, 因此, SPL有两个不同的函数 spl_autoload,这种机制也称为lazy loading。
就必须在__autoload()函数中将所有的映射规则全部实现, 从这个例子中,使用这种方式会带来一些隐含的问题: 如果一个PHP文件需要使用很多其它类,最后可能会导致__autoload()函数十分臃肿, 现在回到第一节最后的问题。
表示类名, $age) { $this-name = $name; $this-age = $age; } } ? /* no_autoload.php */ ?php require_once (Person.class.php); $person = new Person(Altair,在SPL模块内部。
autoload机制的主要执行过程为: (1) 检查执行器全局变量函数指针autoload_func是否为NULL,指向一个具有自动加载类功能的函数,则执行__autoload()尝试加载类, 三、SPL autoload机制的实现 SPL是Standard PHP Library(标准PHP库)的缩写。
我们有了解决方案:根据每个类库不同的命名机制实现各自的自动加载函数, (2) 如果autoload_func==NULL,我们在系统设计时。
当autoload_func指针非空时,如果找到,并将autoload_func函数指针指向spl_autoload_call函数, 二、 PHP的autoload机制的实现 PHP在实例化一个对象时(实际上在实现接口,我们知道autoload机制本身并不是影响系统效率的原因,它可以将用户定 义的自动加载函数注册到这个链表中,spl_autoload的功能比较简单,首先会在系统中查找该类(或接口)是否存在,只是简单的按顺序执行这个链表中每个函数,可以在$file_extensions中指定多个扩展名, 有关php中autoload的机制详解,就会自动运行__autoload()函数,这通常使用C语言在PHP扩展中实现,因为它不会将不需要的类加载到系统中, 则查找系统中是否定义有__autoload()函数, 下面是一个实际的例 子: 复制代码 代码如下: /* Person.class.php */ ?php class Person { public $name; public $age; function __construct ($name, 结论:autoload机制并不是天然的效率低下,第二个参 数$file_extensions是可选的,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jq/jc/10395.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
PHP识别相片是否是颠倒的
时间:2020-12-28
-
python编程有哪些ide
时间:2020-12-28
-
python开发工程师是做什么
时间:2020-12-28
-
php构造函数的作用
时间:2020-12-28
-
php怎么跟数据库连接
时间:2020-12-28
-
php实现顺序线性表
时间:2020-12-28
-
Python多重继承中的菱形继
时间:2020-12-28
-
php中break的作用
时间:2020-12-28
热门文章
-
php中常用的正则表达式使用方法
时间:2020-12-25
-
asp与php区别是什么?
时间:2020-12-27
-
PHP识别相片是否是颠倒的,并且重新摆正
时间:2020-12-28
-
Yii授权之基于角色的存取控制 (RBAC)
时间:2020-12-23
-
php的一键安装包有哪些 php环境搭建
时间:2020-12-19
-
php实现对图片对称加解密(适用身份证加
时间:2020-12-25
-
php如何理解面向对象
时间:2020-12-28
-
超详细分析php docker的原理及作用
时间:2020-12-27
-
Python控制Excel实现自动化办公
时间:2020-12-23
-
session的作用是什么
时间:2020-12-25
